// 个人信息API测试脚本
// 运行方式：在浏览器控制台中执行或使用Node.js运行

const API_BASE_URL = 'http://localhost:8089';

// 测试数据
const testData = {
    userToken: 'test-user-token-12345',
    personalInfo: {
        userToken: 'test-user-token-12345',
        name: '张三',
        phone: '13800138000',
        gender: '男',
        age: 25,
        education: '本科',
        occupation: '程序员',
        religion: '无',
        languages: '["中文","英文"]',
        isDefault: true
    }
};

// 工具函数：发送HTTP请求
async function makeRequest(url, options = {}) {
    try {
        const response = await fetch(url, {
            headers: {
                'Content-Type': 'application/json',
                ...options.headers
            },
            ...options
        });
        
        const data = await response.json();
        console.log(`✅ ${options.method || 'GET'} ${url}`);
        console.log('响应:', data);
        return data;
    } catch (error) {
        console.error(`❌ ${options.method || 'GET'} ${url}`);
        console.error('错误:', error);
        return null;
    }
}

// 测试函数集合
const PersonalInfoAPITest = {
    
    // 1. 测试保存个人信息
    async testSavePersonalInfo() {
        console.log('\n=== 测试保存个人信息 ===');
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/save`, {
            method: 'POST',
            body: JSON.stringify(testData.personalInfo)
        });
        
        if (result && result.code === 200) {
            testData.personalInfoId = result.data.id;
            console.log('✅ 个人信息保存成功，ID:', result.data.id);
        } else {
            console.log('❌ 个人信息保存失败');
        }
        
        return result;
    },
    
    // 2. 测试根据用户Token获取个人信息
    async testGetPersonalInfoByToken() {
        console.log('\n=== 测试根据Token获取个人信息 ===');
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/by-token/${testData.userToken}`);
        
        if (result && result.code === 200) {
            console.log('✅ 获取个人信息成功');
        } else {
            console.log('❌ 获取个人信息失败');
        }
        
        return result;
    },
    
    // 3. 测试检查手机号是否存在
    async testCheckPhoneExists() {
        console.log('\n=== 测试检查手机号 ===');
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/check-phone?phone=${testData.personalInfo.phone}`);
        
        if (result && result.code === 200) {
            console.log('✅ 手机号检查成功，存在状态:', result.data);
        } else {
            console.log('❌ 手机号检查失败');
        }
        
        return result;
    },
    
    // 4. 测试根据手机号获取个人信息
    async testGetPersonalInfoByPhone() {
        console.log('\n=== 测试根据手机号获取个人信息 ===');
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/by-phone/${testData.personalInfo.phone}`);
        
        if (result && result.code === 200) {
            console.log('✅ 根据手机号获取个人信息成功');
        } else {
            console.log('❌ 根据手机号获取个人信息失败');
        }
        
        return result;
    },
    
    // 5. 测试更新个人信息
    async testUpdatePersonalInfo() {
        console.log('\n=== 测试更新个人信息 ===');
        
        if (!testData.personalInfoId) {
            console.log('⚠️ 没有个人信息ID，跳过更新测试');
            return null;
        }
        
        const updatedInfo = {
            ...testData.personalInfo,
            name: '李四',
            age: 26,
            occupation: '设计师'
        };
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/update/${testData.personalInfoId}`, {
            method: 'PUT',
            body: JSON.stringify(updatedInfo)
        });
        
        if (result && result.code === 200) {
            console.log('✅ 个人信息更新成功');
        } else {
            console.log('❌ 个人信息更新失败');
        }
        
        return result;
    },
    
    // 6. 测试设置默认个人信息
    async testSetDefaultPersonalInfo() {
        console.log('\n=== 测试设置默认个人信息 ===');
        
        if (!testData.personalInfoId) {
            console.log('⚠️ 没有个人信息ID，跳过设置默认测试');
            return null;
        }
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/set-default?userToken=${testData.userToken}&personalInfoId=${testData.personalInfoId}`, {
            method: 'POST'
        });
        
        if (result && result.code === 200) {
            console.log('✅ 设置默认个人信息成功');
        } else {
            console.log('❌ 设置默认个人信息失败');
        }
        
        return result;
    },
    
    // 7. 测试重复手机号保存（应该失败）
    async testDuplicatePhoneSave() {
        console.log('\n=== 测试重复手机号保存 ===');
        
        const duplicateInfo = {
            ...testData.personalInfo,
            userToken: 'another-user-token-67890',
            name: '王五'
        };
        
        const result = await makeRequest(`${API_BASE_URL}/personalInfo/save`, {
            method: 'POST',
            body: JSON.stringify(duplicateInfo)
        });
        
        if (result && result.code === 400) {
            console.log('✅ 重复手机号保存被正确拒绝');
        } else {
            console.log('❌ 重复手机号保存处理异常');
        }
        
        return result;
    },
    
    // 执行所有测试
    async runAllTests() {
        console.log('🚀 开始执行个人信息API测试');
        console.log('==============================');
        
        try {
            await this.testSavePersonalInfo();
            await this.testGetPersonalInfoByToken();
            await this.testCheckPhoneExists();
            await this.testGetPersonalInfoByPhone();
            await this.testUpdatePersonalInfo();
            await this.testSetDefaultPersonalInfo();
            await this.testDuplicatePhoneSave();
            
            console.log('\n==============================');
            console.log('🎉 所有测试执行完毕');
            
        } catch (error) {
            console.error('💥 测试执行过程中出现错误:', error);
        }
    }
};

// 如果在浏览器环境中，可以直接调用
if (typeof window !== 'undefined') {
    console.log('🌐 在浏览器环境中运行测试');
    console.log('请确保后端服务已启动在 http://localhost:8080');
    console.log('执行 PersonalInfoAPITest.runAllTests() 开始测试');
    
    // 自动执行测试（可选）
    // PersonalInfoAPITest.runAllTests();
}

// Node.js环境导出
if (typeof module !== 'undefined' && module.exports) {
    module.exports = PersonalInfoAPITest;
}

// 使用说明
console.log(`
📖 使用说明：
1. 确保Spring Boot后端服务运行在8080端口
2. 在浏览器控制台执行: PersonalInfoAPITest.runAllTests()
3. 或者单独执行某个测试: PersonalInfoAPITest.testSavePersonalInfo()

🔧 API端点列表：
- POST /personalInfo/save              - 保存个人信息
- PUT /personalInfo/update/{id}        - 更新个人信息  
- GET /personalInfo/by-token/{token}   - 根据Token获取
- GET /personalInfo/check-phone        - 检查手机号
- GET /personalInfo/by-phone/{phone}   - 根据手机号获取
- POST /personalInfo/set-default       - 设置默认
`); 